//上述我们是使用了泛型，但是我们创建的数组是object类型，
//但是我们可以创建泛型数组
//泛型语法：
/*
1.普通泛型
class Name<T1,T2,…,Tn>{
      但是这个时候的<>中内容在类的实例化是要对应上自己的数据类型
}*/
/*
2.继承关系泛型
class ClassName<T1,T2,…Tn> extends ParentClass<T1>{

}
 */


//常用名称
/*
E 表示 Element
K 表示 Key
V 表示 Value
N 表示 Number
T 表示 Type
S, U, V 等等 - 第二、第三、第四个类型
 */

//接下来就是我们用了泛型数组
class MyArray1<T>{
    /*
    public T[] array = new T[10];
    在Java中不允许实例化一个泛型数组，因为数组在Java中也是一种特殊的数据类型
     */
    public T[] array = (T[]) new Object[10];//这样写就是把Object类进行强制转化为T类型数组。

    public T getArray(int pos) {
        return (T)this.array[pos];
    }

    public void setArray(int pos,T val) {
        array[pos] = val;
    }
}
public class Test {
    public static void main(String[] args) {
        MyArray1<Integer> myArray1 = new MyArray1<>();
        myArray1.setArray(0,1);
        int a = myArray1.getArray(0);
        System.out.println(a);
    }
}
//注意：
// 泛型只能接受类，所有的基本数据类型必须要使用各自的包装类
// 在< >中必须用引用类型，不能是基本数据类型，所以用包装类

//类型推导：当编译器可以根据上下文推导出类型实参时，可以省略实参的填写，
//MyArray1<Integer> myArray1 = new MyArray<Integer>();
//但是new后面的Integer可以不用去写

//裸类型
//裸类型是一个泛型类但没有带着类型实参：
//MyArray1 list = new MyArray();
//注意： 我们不要自己去使用裸类型，裸类型是为了兼容老版本的API保留的机制

/*
泛型的优势：
1.将数据类型进行参数化，进行传递
2.<T>表示是一个泛型类
3.数据类型参数化，编译时自动进行类型检查和转换
 */
